home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / russell / gc.lha / mach_dep.c < prev    next >
C/C++ Source or Header  |  1993-03-04  |  8KB  |  213 lines

  1. # include "gc_private.h"
  2. # include <stdio.h>
  3. # include <setjmp.h>
  4. # ifdef OS2
  5. #   define _setjmp(b) setjmp(b)
  6. #   define _longjmp(b,v) longjmp(b,v)
  7. # endif
  8.  
  9. /* Routine to mark from registers that are preserved by the C compiler. */
  10. /* This must be ported to every new architecture.  There is a generic   */
  11. /* version at the end, that is likely, but not guaranteed to work       */
  12. /* on your architecture.  Run the test_setjmp program to see whether    */
  13. /* there is any chance it will work.                                    */
  14. GC_mark_regs()
  15. {
  16. #       ifdef RT
  17.       register long TMP_SP; /* must be bound to r11 */
  18. #       endif
  19. #       ifdef VAX
  20.     /* VAX - generic code below does not work under 4.2 */
  21.       /* r1 through r5 are caller save, and therefore     */
  22.       /* on the stack or dead.                            */
  23.       asm("pushl r11");     asm("calls $1,_GC_tl_mark");
  24.       asm("pushl r10");     asm("calls $1,_GC_tl_mark");
  25.       asm("pushl r9");    asm("calls $1,_GC_tl_mark");
  26.       asm("pushl r8");    asm("calls $1,_GC_tl_mark");
  27.       asm("pushl r7");    asm("calls $1,_GC_tl_mark");
  28.       asm("pushl r6");    asm("calls $1,_GC_tl_mark");
  29. #       endif
  30. #       if defined(M68K) && defined(SUNOS)
  31.     /*  M68K SUNOS - could be replaced by generic code */
  32.       /* a0, a1 and d1 are caller save          */
  33.       /*  and therefore are on stack or dead.   */
  34.     
  35.       asm("subqw #0x4,sp");        /* allocate word on top of stack */
  36.  
  37.       asm("movl a2,sp@");    asm("jbsr _GC_tl_mark");
  38.       asm("movl a3,sp@");    asm("jbsr _GC_tl_mark");
  39.       asm("movl a4,sp@");    asm("jbsr _GC_tl_mark");
  40.       asm("movl a5,sp@");    asm("jbsr _GC_tl_mark");
  41.       /* Skip frame pointer and stack pointer */
  42.       asm("movl d1,sp@");    asm("jbsr _GC_tl_mark");
  43.       asm("movl d2,sp@");    asm("jbsr _GC_tl_mark");
  44.       asm("movl d3,sp@");    asm("jbsr _GC_tl_mark");
  45.       asm("movl d4,sp@");    asm("jbsr _GC_tl_mark");
  46.       asm("movl d5,sp@");    asm("jbsr _GC_tl_mark");
  47.       asm("movl d6,sp@");    asm("jbsr _GC_tl_mark");
  48.       asm("movl d7,sp@");    asm("jbsr _GC_tl_mark");
  49.  
  50.       asm("addqw #0x4,sp");        /* put stack back where it was    */
  51. #       endif
  52.  
  53. #       if defined(M68K) && defined(HP)
  54.     /*  M68K HP - could be replaced by generic code */
  55.       /* a0, a1 and d1 are caller save.  */
  56.     
  57.       asm("subq.w &0x4,%sp");    /* allocate word on top of stack */
  58.  
  59.       asm("mov.l %a2,(%sp)"); asm("jsr _GC_tl_mark");
  60.       asm("mov.l %a3,(%sp)"); asm("jsr _GC_tl_mark");
  61.       asm("mov.l %a4,(%sp)"); asm("jsr _GC_tl_mark");
  62.       asm("mov.l %a5,(%sp)"); asm("jsr _GC_tl_mark");
  63.       /* Skip frame pointer and stack pointer */
  64.       asm("mov.l %d1,(%sp)"); asm("jsr _GC_tl_mark");
  65.       asm("mov.l %d2,(%sp)"); asm("jsr _GC_tl_mark");
  66.       asm("mov.l %d3,(%sp)"); asm("jsr _GC_tl_mark");
  67.       asm("mov.l %d4,(%sp)"); asm("jsr _GC_tl_mark");
  68.       asm("mov.l %d5,(%sp)"); asm("jsr _GC_tl_mark");
  69.       asm("mov.l %d6,(%sp)"); asm("jsr _GC_tl_mark");
  70.       asm("mov.l %d7,(%sp)"); asm("jsr _GC_tl_mark");
  71.  
  72.       asm("addq.w &0x4,%sp");    /* put stack back where it was    */
  73. #       endif /* M68K HP */
  74.  
  75. #       if defined(I386) && !defined(OS2) && !defined(SUNOS5)
  76.     /* I386 code, generic code does not appear to work */
  77.     /* It does appear to work under OS2, and asms dont */
  78.       asm("pushl %eax");  asm("call _GC_tl_mark"); asm("addl $4,%esp");
  79.       asm("pushl %ecx");  asm("call _GC_tl_mark"); asm("addl $4,%esp");
  80.       asm("pushl %edx");  asm("call _GC_tl_mark"); asm("addl $4,%esp");
  81.       asm("pushl %esi");  asm("call _GC_tl_mark"); asm("addl $4,%esp");
  82.       asm("pushl %edi");  asm("call _GC_tl_mark"); asm("addl $4,%esp");
  83.       asm("pushl %ebx");  asm("call _GC_tl_mark"); asm("addl $4,%esp");
  84. #       endif
  85.  
  86. #       if defined(I386) && defined(SUNOS5)
  87.     /* I386 code, generic code does not appear to work */
  88.     /* It does appear to work under OS2, and asms dont */
  89.       asm("pushl %eax");  asm("call GC_tl_mark"); asm("addl $4,%esp");
  90.       asm("pushl %ecx");  asm("call GC_tl_mark"); asm("addl $4,%esp");
  91.       asm("pushl %edx");  asm("call GC_tl_mark"); asm("addl $4,%esp");
  92.       asm("pushl %esi");  asm("call GC_tl_mark"); asm("addl $4,%esp");
  93.       asm("pushl %edi");  asm("call GC_tl_mark"); asm("addl $4,%esp");
  94.       asm("pushl %ebx");  asm("call GC_tl_mark"); asm("addl $4,%esp");
  95. #       endif
  96.  
  97. #       ifdef NS32K
  98.       asm ("movd r3, tos"); asm ("bsr ?_GC_tl_mark"); asm ("adjspb $-4");
  99.       asm ("movd r4, tos"); asm ("bsr ?_GC_tl_mark"); asm ("adjspb $-4");
  100.       asm ("movd r5, tos"); asm ("bsr ?_GC_tl_mark"); asm ("adjspb $-4");
  101.       asm ("movd r6, tos"); asm ("bsr ?_GC_tl_mark"); asm ("adjspb $-4");
  102.       asm ("movd r7, tos"); asm ("bsr ?_GC_tl_mark"); asm ("adjspb $-4");
  103. #       endif
  104.  
  105. #       ifdef SPARC
  106.       /* generic code will not work */
  107.       GC_save_regs_in_stack();
  108. #       endif
  109.  
  110. #    ifdef RT
  111.         GC_tl_mark(TMP_SP);    /* GC_tl_mark from r11 */
  112.  
  113.         asm("cas r11, r6, r0"); GC_tl_mark(TMP_SP);    /* r6 */
  114.         asm("cas r11, r7, r0"); GC_tl_mark(TMP_SP);    /* through */
  115.         asm("cas r11, r8, r0"); GC_tl_mark(TMP_SP);    /* r10 */
  116.         asm("cas r11, r9, r0"); GC_tl_mark(TMP_SP);
  117.         asm("cas r11, r10, r0"); GC_tl_mark(TMP_SP);
  118.  
  119.         asm("cas r11, r12, r0"); GC_tl_mark(TMP_SP); /* r12 */
  120.         asm("cas r11, r13, r0"); GC_tl_mark(TMP_SP); /* through */
  121.         asm("cas r11, r14, r0"); GC_tl_mark(TMP_SP); /* r15 */
  122.         asm("cas r11, r15, r0"); GC_tl_mark(TMP_SP);
  123. #       endif
  124.  
  125. #       if defined(M68K) && defined(SYSV)
  126.       /*  Once again similar to SUN and HP, though setjmp appears to work.
  127.           --Parag
  128.        */
  129. #        ifdef __GNUC__
  130.         asm("subqw #0x4,%sp");    /* allocate word on top of stack */
  131.   
  132.         asm("movl %a2,%sp@");    asm("jbsr GC_tl_mark");
  133.         asm("movl %a3,%sp@");    asm("jbsr GC_tl_mark");
  134.         asm("movl %a4,%sp@");    asm("jbsr GC_tl_mark");
  135.         asm("movl %a5,%sp@");    asm("jbsr GC_tl_mark");
  136.         /* Skip frame pointer and stack pointer */
  137.         asm("movl %d1,%sp@");    asm("jbsr GC_tl_mark");
  138.         asm("movl %d2,%sp@");    asm("jbsr GC_tl_mark");
  139.         asm("movl %d3,%sp@");    asm("jbsr GC_tl_mark");
  140.         asm("movl %d4,%sp@");    asm("jbsr GC_tl_mark");
  141.         asm("movl %d5,%sp@");    asm("jbsr GC_tl_mark");
  142.         asm("movl %d6,%sp@");    asm("jbsr GC_tl_mark");
  143.         asm("movl %d7,%sp@");    asm("jbsr GC_tl_mark");
  144.   
  145.         asm("addqw #0x4,%sp");    /* put stack back where it was    */
  146. #        else /* !__GNUC__*/
  147.         asm("subq.w &0x4,%sp");    /* allocate word on top of stack */
  148.   
  149.         asm("mov.l %a2,(%sp)"); asm("jsr GC_tl_mark");
  150.         asm("mov.l %a3,(%sp)"); asm("jsr GC_tl_mark");
  151.         asm("mov.l %a4,(%sp)"); asm("jsr GC_tl_mark");
  152.         asm("mov.l %a5,(%sp)"); asm("jsr GC_tl_mark");
  153.         /* Skip frame pointer and stack pointer */
  154.         asm("mov.l %d1,(%sp)"); asm("jsr GC_tl_mark");
  155.         asm("mov.l %d2,(%sp)"); asm("jsr GC_tl_mark");
  156.         asm("mov.l %d3,(%sp)"); asm("jsr GC_tl_mark");
  157.         asm("mov.l %d4,(%sp)"); asm("jsr GC_tl_mark");
  158.         asm("mov.l %d5,(%sp)"); asm("jsr GC_tl_mark");
  159.          asm("mov.l %d6,(%sp)"); asm("jsr GC_tl_mark");
  160.         asm("mov.l %d7,(%sp)"); asm("jsr GC_tl_mark");
  161.   
  162.         asm("addq.w &0x4,%sp");    /* put stack back where it was    */
  163. #        endif /* !__GNUC__ */
  164. #       endif /* M68K/SYSV */
  165.  
  166.  
  167. #     if defined(HP_PA) || (defined(I386) && defined(OS2))
  168.     /* Generic code                          */
  169.     /* The idea is due to Parag Patel at HP. */
  170.     /* We're not sure whether he would like  */
  171.     /* to be he acknowledged for it or not.  */
  172.     {
  173.         jmp_buf regs;
  174.         register word * i = (word *) regs;
  175.         register ptr_t lim = (ptr_t)(regs) + (sizeof regs);
  176.  
  177.         /* Setjmp on Sun 3s doesn't clear all of the buffer.  */
  178.         /* That tends to preserve garbage.  Clear it.         */
  179.         for (; (char *)i < lim; i++) {
  180.             *i = 0;
  181.         }
  182.         (void) _setjmp(regs);
  183.         GC_mark_all_stack((ptr_t)regs, lim);
  184.     }
  185. #     endif
  186.  
  187.       /* other machines... */
  188. #       if !(defined M68K) && !(defined VAX) && !(defined RT) 
  189. #    if !(defined SPARC) && !(defined I386) &&!(defined NS32K)
  190. #    if !defined(HP_PA)
  191.         --> bad news <--
  192. #       endif
  193. #       endif
  194. #       endif
  195. }
  196.  
  197. /* On register window machines, we need a way to force registers into     */
  198. /* the stack.                                */
  199. # ifdef SPARC
  200. #   ifdef SUNOS5
  201.       asm("    .globl    GC_save_regs_in_stack");
  202.       asm("GC_save_regs_in_stack:");
  203. #   else
  204.       asm("    .globl    _GC_save_regs_in_stack");
  205.       asm("_GC_save_regs_in_stack:");
  206. #   endif
  207.     asm("    ta    0x3   ! ST_FLUSH_WINDOWS");
  208.     asm("    mov    %sp,%o0");
  209.     asm("    retl");
  210.     asm("    nop");
  211. # endif
  212.  
  213.